iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 21
0
IoT

玩玩 BLE系列 第 21

[Day 21] TI-RTOS 執行緒的同步(Thread Synchronization)

  • 分享至 

  • xImage
  •  

TI-RTOS 提供幾個用於同步任務(Task)的模組,例如:號誌或稱信號(Semaphore)、事件(Event)和佇列(Queue)。

號誌/信號 (Semaphore)

號誌通常用於TI-RTOS 應用程序中的任務同步和任務互斥。
例如:兩個任務都會使用到記憶體的讀寫,
但記憶體一次只能接受一個任務的操作,
透過號誌來對記憶體讀寫的這個操作進行管理,
號誌就像是鑰匙的管理者,
因為一次只能有一個任務進行記憶體讀寫,
所以鑰匙只有一把,
當拿到鑰匙的人才能進行操作,
沒拿到鑰匙的就必須在旁邊等待。
依照鑰匙的數量,
可分為可以配發多把鑰匙的計數型號誌(Counting Semaphore)及只發一把鑰匙的二元型號誌(Binary Semaphore)。

SimplePeripheral的程式沒用到號誌,但我在I2C的驅動(bsp_i2c.c)中找到號誌的範例,
I2C是一種晶片之間常用的通訊規範,不知道是什麼也沒關係,
我們就把它當作一個出入口,但一次只能給一個任務來使用
現在就來看一下號誌如何使用吧。

// I2C的初始化
void bspI2cInit(void)
{
Semaphore_Params semParamsMutex;
...
// 號誌參數的初始化
Semaphore_Params_init(&semParamsMutex);
// 號誌的模式為 BINARY_MODE(只有一把鑰匙)
semParamsMutex.mode = Semaphore_Mode_BINARY;
// 建立號誌
Semaphore_construct(&mutex, 1, &semParamsMutex);
}

按照bsp_i2c 驅動的使用方法,
使用I2C前,必須要先呼叫bspI2cAcquire()
使用I2C後,則必須要呼叫bspI2cRelease()

void bspI2cAcquire(uint8_t newInterface, uint8_t address)
{
  // 向號誌(Semaphore)詢問是否有鑰匙可用,否則就一直等
  // 第二個參數是等待時間,在這邊設成BIOS_WAIT_FOREVER
  // 即等到有鑰匙為止
  Semaphore_pend(Semaphore_handle(&mutex),BIOS_WAIT_FOREVER);
}

void bspI2cRelease(void)
{
  // 把鑰匙還給號誌(Semaphore)
  Semaphore_post(Semaphore_handle(&mutex));
}

事件(Event)

事件和號誌類似,不過事件可以向任務通知特定事件。例如前篇文章提到的定時器到期事件。


上一篇
[Day 20] TI-RTOS 佇列(Queue)
下一篇
[Day 22] 晶片間的通訊-I2C
系列文
玩玩 BLE27
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言